//
//  UIImage+Utils.m
//  justTest
//
//  Created by 小零钱 on 2018/3/1.
//  Copyright © 2018年 小零钱. All rights reserved.
//

/*
 runtime 交换方法
 
 应用场景：当第三方框架或者系统原生方法功能不能满足需求的时候，可以在保持系统原有方法功能的基础上，添加额外的功能。
 
 需求：加载一张图片直接用[UIImage imageNamed:@"image"];是无法知道到底有没有加载成功。给系统的imageNamed添加额外功能（是否加载图片成功）。
 
 方案一：继承系统的类，重写方法.（弊端：每次使用都需要导入）
 方案二：使用 runtime，交换方法.
 */

#import "UIImage+Utils.h"
#import <objc/message.h>

@implementation UIImage (Utils)

/**
 load方法: 把类加载进内存的时候调用,只会调用一次
 方法应先交换，再去调用
 */
+ (void)load {
    Method imagedNamedMethod = class_getClassMethod((Class)self, @selector(imageNamed:));
    Method xl_imagedNamedMethod = class_getClassMethod((Class)self, @selector(xl_imageNamed:));
    method_exchangeImplementations(imagedNamedMethod, xl_imagedNamedMethod);
}


+ (UIImage *)xl_imageNamed:(NSString *)name {
    UIImage * image = [UIImage xl_imageNamed:name];
    if (image) {
        NSLog(@"runtime添加额外功能--加载成功！");
    }
    else {
        NSLog(@"runtime添加额外功能--加载失败！");
    }
    return image;
}

@end
